package procsim;

public class RSFlipFlop extends FlipFlop{
    private Signal inSigR, inSigS, inSigRPrev, inSigSPrev;
    public RSFlipFlop(Signal inR, Signal inS){
        super();
        if(inR!=null) inR.addElement(this);
        if(inS!=null) inS.addElement(this);
        inSigR=inR;
        inSigS=inS;
        inSigRPrev=new Signal(0);
        inSigSPrev=new Signal(0);
    }
    public RSFlipFlop(){
        super();
        inSigRPrev=new Signal(0);
        inSigSPrev=new Signal(0);
    }
    public RSFlipFlop setRSignal(Signal rsig){
        if(rsig!=null) rsig.addElement(this);
        inSigR=rsig;
        return this;
    }
    public RSFlipFlop setSSignal(Signal ssig){
        if(ssig!=null) ssig.addElement(this);
        inSigS=ssig;
        return this;
    }
    @Override
    public RSFlipFlop tick(){
        int val=0;
        if(inSigS!=null && inSigR!=null){
            if(inSigS.get()==0 && inSigR.get()==0)
                val=outSigPrev.get();
            else if(inSigS.get()==1 && inSigR.get()==0)
                val=1;
            else if(inSigS.get()==0 && inSigR.get()==1)
                val=0;
            else{
                System.err.println("Nemoguca kombinacija Set i Reset bita!");
                val=-1;
            }
        }
        outSig.set(outSigPrev);
        if(outSigResult!=null) outSigResult.set(outSig);
        outSigPrev.set(val);
        calculateComplement();
        inSigSPrev.set(inSigS);
        inSigRPrev.set(inSigR);
        return this;
    }
    public RSFlipFlop ammendR(Signal SigR){
        int val=0;
        if(SigR.get()==inSigRPrev.get()) return this;
        if(inSigSPrev!=null && SigR!=null){
            if(inSigSPrev.get()==0 && SigR.get()==0)
                val=inSigSPrev.get();
            else if(inSigSPrev.get()==1 && SigR.get()==0)
                val=1;
            else if(inSigSPrev.get()==0 && SigR.get()==1)
                val=0;
            else{
                System.err.println("Nemoguca kombinacija Set i Reset bita!");
                val=-1;
            }
        }
        outSigPrev.set(val);
        return this;
    }
    public RSFlipFlop ammendS(Signal SigS){
        int val=0;
        if(SigS.get()==inSigSPrev.get()) return this;
        if(SigS!=null && inSigRPrev!=null){
            if(SigS.get()==0 && inSigRPrev.get()==0)
                val=outSigPrev.get();
            else if(SigS.get()==1 && inSigRPrev.get()==0)
                val=1;
            else if(SigS.get()==0 && inSigRPrev.get()==1)
                val=0;
            else{
                System.err.println("Nemoguca kombinacija Set i Reset bita!");
                val=-1;
            }
        }
        outSigPrev.set(val);
        return this;
    }
    @Override
    public void updateSignal(Sig sig){
        if(ticking) return;
        if(inSigR!=null && inSigR==sig)
            inSigR.set(sig.get(), false);
        if(inSigS!=null && inSigS==sig)
            inSigS.set(sig.get(), false);
    }
}
